import * as signalR from '@microsoft/signalr';
import { useUserStore } from "@/stores/modules/user";

const userStore = useUserStore();
// 定义 SignalRService 类
export default class SignalRService {
    connection: null;
    retryCount: number;
    maxRetryAttempts: number;
    retryInterval: number;
	//option为调用SignalRService 类传进来的参数
    constructor(option) {
        // 初始化 SignalR 连接对象为 null
        this.connection = null;        
        //this.url = options.url || "";
        // 初始化重试次数为 0
        this.retryCount = 0;
        // 最大重试次数
        this.maxRetryAttempts = 5;
        // 重试间隔（毫秒）
        this.retryInterval = 5000;
    }

    // 初始化 SignalR 连接的方法
    initSignalR(url) {
        // 创建 SignalR 连接对象，并指定后端的 URL
        this.connection = new signalR.HubConnectionBuilder()
          .withUrl(url, { accessTokenFactory: () => userStore.token })
          .build();

        // 调用启动连接的方法
        this.startConnection();
    }

    // 实际启动连接的方法
    startConnection() {
        // 尝试启动连接
        this.connection.start().then(() => {
            // 连接成功，打印日志并重置重试次数
            console.log('Connected to SignalR successfully!');            
            this.retryCount = 0;
        }).catch(err => {
            // 连接失败，打印错误日志
            console.error('Error connecting to SignalR:', err);
            // 如果重试次数小于最大重试次数
            if (this.retryCount < this.maxRetryAttempts) {
                // 设置一个定时器，在指定间隔后重试连接，并增加重试次数
                setTimeout(() => {
                    this.retryCount++;
                    this.startConnection();
                }, this.retryInterval);
            }
        });
    }

    // 用于注册消息接收回调函数的方法
    onMessageReceived(callback) {
        //.net 在连接对象上注册消息接收事件的回调函数
        this.connection.on("ReceiveMessage", callback);
        // java 在连接对象上注册消息接收事件的回调函数
        //this.connection.on("message", callback);
    }

    // 停止 SignalR 连接的方法
    stopSignalR() {
        // 如果存在连接对象
        if (this.connection) {
            // 停止连接，并打印日志
            this.connection.stop();
            console.log('Disconnected from SignalR.');
        }
    }
}
